<!doctype html>
<!-- Created with GFM2HTML: https://github.com/rvagg/gfm2html -->
<html lang="en">
  <head>
    <meta charset="utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <title></title>
    <meta name="description" content="">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <meta name="created-with" content="https://github.com/rvagg/gfm2html">

    <style type="text/css">
/* most of normalize.css */
article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block;}[hidden],template{display:none;}html{font-family:sans-serif;/*1*/-ms-text-size-adjust:100%;/*2*/-webkit-text-size-adjust:100%;/*2*/}body{margin:0;}a{background:transparent;}a:focus{outline:thindotted;}a:active,a:hover{outline:0;}h1{font-size:2em;margin:0.67em0;}abbr[title]{border-bottom:1pxdotted;}b,strong{font-weight:bold;}dfn{font-style:italic;}hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0;}mark{background:#ff0;color:#000;}code,kbd,pre,samp{font-family:monospace,serif;font-size:1em;}pre{white-space:pre-wrap;}q{quotes:"\201C""\201D""\2018""\2019";}small{font-size:80%;}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline;}sup{top:-0.5em;}sub{bottom:-0.25em;}img{border:0;}svg:not(:root){overflow:hidden;}table{border-collapse:collapse;border-spacing:0;}

html {
  font: 14px 'Helvetica Neue', Helvetica, arial, freesans, clean, sans-serif;
}

.container {
  line-height: 1.6;
  color: #333;
  background: #eee;
  border-radius: 3px;
  padding: 3px;
  width: 790px;
  margin: 10px auto;
}

.body-content {
  background-color: #fff;
  border: 1px solid #CACACA;
  padding: 30px;
}

.body-content > *:first-child {
  margin-top: 0 !important;
}

a, a:visited {
  color: #4183c4;
  text-decoration: none;
}

a:hover {
  text-decoration: underline;
}

p, blockquote, ul, ol, dl, table, pre {
  margin: 15px 0;
}

  .markdown-body h1
, .markdown-body h2
, .markdown-body h3
, .markdown-body h4
, .markdown-body h5
, .markdown-body h6 {
  margin: 20px 0 10px;
  padding: 0;
  font-weight: bold;
}

h1 {
  font-size: 2.5em;
  color: #000;
  border-bottom: 1px solid #ddd;
}

h2 {
  font-size: 2em;
  border-bottom: 1px solid #eee;
  color: #000;
}

img {
  max-width: 100%;
}

hr {
  background: transparent url("/img/hr.png") repeat-x 0 0;
  border: 0 none;
  color: #ccc;
  height: 4px;
  padding: 0;
}

table {
  border-collapse: collapse;
  border-spacing: 0;
}

tr:nth-child(2n) {
  background-color: #f8f8f8;
}

.markdown-body tr {
  border-top: 1px solid #ccc;
  background-color: #fff;
}

td, th {
  border: 1px solid #ccc;
  padding: 6px 13px;
}

th {
  font-weight: bold;
}

blockquote {
  border-left: 4px solid #ddd;
  padding: 0 15px;
  color: #777;
}

blockquote > :last-child, blockquote > :first-child {
  margin-bottom: 0px;
}

pre, code {
  font-size: 13px;
  font-family: 'UbuntuMono', monospace;
  white-space: nowrap;
  margin: 0 2px;
  padding: 0px 5px;
  border: 1px solid #eaeaea;
  background-color: #f8f8f8;
  border-radius: 3px;
}

pre > code {
  white-space: pre;
}

pre {
  overflow-x: auto;
  white-space: pre;
  padding: 10px;
  line-height: 150%;
  background-color: #f8f8f8;
  border-color: #ccc;
}

pre code, pre tt {
  margin: 0;
  padding: 0;
  border: 0;
  background-color: transparent;
  border: none;
}

  .highlight .c
, .highlight .cm
, .highlight .cp
, .highlight .c1 {
    color:#999988;
    font-style:italic;
}

.highlight .err {
  color:#a61717;
  background-color:#e3d2d2
}

  .highlight .o
, .highlight .gs
, .highlight .kc
, .highlight .kd
, .highlight .kn
, .highlight .kp
, .highlight .kr {
    font-weight:bold
}

.highlight .cs {
  color:#999999;
  font-weight:bold;
  font-style:italic
}

.highlight .gd {
  color:#000000;
  background-color:#ffdddd
}

.highlight .gd .x {
  color:#000000;
  background-color:#ffaaaa
}

.highlight .ge {
  font-style:italic
}

  .highlight .gr
, .highlight .gt {
    color:#aa0000
}

  .highlight .gh
, .highlight .bp {
    color:#999999
}

.highlight .gi {
  color:#000000;
  background-color:#ddffdd
}

.highlight .gi .x {
  color:#000000;
  background-color:#aaffaa
}

.highlight .go {
  color:#888888
}

  .highlight .gp
, .highlight .nn {
    color:#555555
}


.highlight .gu {
  color:#800080;
  font-weight:bold
}


.highlight .kt {
  color:#445588;
  font-weight:bold
}

  .highlight .m
, .highlight .mf
, .highlight .mh
, .highlight .mi
, .highlight .mo
, .highlight .il {
    color:#009999
}

  .highlight .s
, .highlight .sb
, .highlight .sc
, .highlight .sd
, .highlight .s2
, .highlight .se
, .highlight .sh
, .highlight .si
, .highlight .sx
, .highlight .s1 {
    color:#d14
}

.highlight .n {
  color:#333333
}

  .highlight .na
, .highlight .no
, .highlight .nv
, .highlight .vc
, .highlight .vg
, .highlight .vi
, .highlight .nb {
    color:#0086B3
}

.highlight .nc {
  color:#445588;
  font-weight:bold
}

.highlight .ni {
  color:#800080
}

  .highlight .ne
, .highlight .nf {
    color:#990000;
    font-weight:bold
}

.highlight .nt {
  color:#000080
}

.highlight .ow {
  font-weight:bold
}

.highlight .w {
  color:#bbbbbb
}

.highlight .sr {
  color:#009926
}

.highlight .ss {
  color:#990073
}

.highlight .gc {
  color:#999;
  background-color:#EAF2F5
}

@media print {
  .container {
    background: transparent;
    border-radius: 0;
    padding: 0;
  }

  .body-content {
    border: none;
  }
}
</style>
  </head>
  <body>
    <div class="container">
      <div class="body-content"><h1 id="nodejs-org-download-metrics">nodejs.org Download Metrics</h1>
<p>This directory contains anonymized log records for binary and source downloads of Node.js from nodejs.org.</p>
<h2 id="what-data-is-available-">What data is available?</h2>
<p>There is roughly one log file per day, starting on the 14th of May 2014 to the current day. There is a gap in the data from the 1st to the 21st of September 2015 due to a server configuration error.</p>
<p>The data is gleaned from the access logs by matching for known binary and source files in <a href="https://nodejs.org/dist/">/dist</a> and the newer <a href="https://nodejs.org/download/release">/download/release/</a> which is where the /dist/ directory also points. No other access log information is included in the data available here.</p>
<p>IP addresses and exact times are not reported, only days and geolocation data for the original IP addresses.</p>
<h2 id="what-format-is-the-data-in-">What format is the data in?</h2>
<p>Raw log files are available in the <strong><a href="./logs/">./logs/</a></strong> sub-directory where each file&#39;s name takes the form: <code>nodejs.org-access.log.YYYYMMDD.TTTTTTTTTT.csv</code>, where the last entry in the file is used to create the string <code>YYYYMMDD</code> from the year, month and day of the month respectively and <code>TTTTTTTTTT</code> as the unix epoch timestamp. There may zero, one or two log files for a given day. However, when stitched together they should form a continuous record of the downloads from nodejs.org.</p>
<p>There is always a <a href="./logs/nodejs.org-access.log.csv">nodejs.org-access.log.csv</a> file which represents the <em>current day&#39;s</em> data and <strong>is not final</strong>, i.e. it will change from update to update, either appending new data or starting again for a new day. The other log files can be considered final until we decide to adjust the format at some point in the future.</p>
<p>The raw log files are comma-separated value format with the following columns: day, country, region, path, version, os, arch, bytes.</p>
<p><strong><em>Country</em></strong> and <strong><em>region</em></strong> are calculated by using MaxMind&#39;s <a href="http://dev.maxmind.com/geoip/geoip2/geolite2/">GeoLite2 City</a> database and some entries may contain blank values where the look-up fails. <code>X-Forwarded-For</code> headers are used to determine the most likely origin IP address by parsing out the <a href="https://r.va.gg/2011/07/wrangling-the-x-forwarded-for-header.html">leftmost non-private address</a>.</p>
<p>The <strong><em>path</em></strong> field contains the actual path that was requested by the client, with the <strong><em>version</em></strong>, <strong><em>os</em></strong> and <strong><em>arch</em></strong> columns calculated from this value.</p>
<p>The <strong><em>version</em></strong> field is occasionaly empty due to the availability of <code>node-latest.tar.gz</code> which is a symlink to the latest source tarball and the various <code>latest</code> directory symlinks when used to download <code>node.exe</code> (versions could be roughly calculated for all of these when matched with release dates if desired).</p>
<p>The <strong>os</strong> field contains operating system identifiers as well as <code>src</code> for source tarballs and <code>headers</code> for header tarballs.</p>
<p>The <strong>arch</strong> field is blank when <strong>os</strong> is <code>src</code> or <code>headers</code>.</p>
<h2 id="pre-processed-summary-data">Pre-processed summary data</h2>
<p>A set of pre-processed summary data is also made available in the <strong><a href="./summaries/">./summaries/</a></strong> sub-directory. Each type of summary consists of:</p>
<ul>
<li>A directory containing CSV files with names matching the raw log file names and rows containing aggregated per-day data for the given summary datatype. Most of these files contain two rows, for two days, as the raw log files don&#39;t span neatly across day boundaries.</li>
<li>An aggregation file, in CSV format, where each row is a single day during the full period for which there is available data.</li>
<li>A PNG file with a simple plot of the data.</li>
</ul>
<h3 id="total">Total</h3>
<p>Contains two data columns: <strong><em>downloads</em></strong> and <strong><em>TiB</em></strong>, where TiB is 2<sup>40</sup> bytes.</p>
<p>Source data: <a href="./summaries/total/">./summaries/total/</a></p>
<p>Aggregate data: <a href="./summaries/total.csv">./summaries/total.csv</a></p>
<p>Plot:</p>
<p><a href="./summaries/total.png"><img src="./summaries/total.png"></a></p>
<h3 id="architectures">Architectures</h3>
<p>Contains a data column per distributed architecture, including <strong><em>unknown</em></strong> where the architecture cannot be determined (source or header tarballs). The columns are ordered by totals where the architecture that has the highest total is listed first and so on, the column ordering may therefore change over time. The list is not fixed and may expand when additional architectures are distributed from nodejs.org. The <strong>.pkg</strong> OS X installers are counted as <strong><em>x64</em></strong> even though, prior to Node.js v4, they were &quot;universal binaries&quot; containing both x64 and x86 versions, usable on both architectures.</p>
<p>Source data: <a href="./summaries/arch/">./summaries/arch/</a></p>
<p>Aggregate data: <a href="./summaries/arch.csv">./summaries/arch.csv</a></p>
<p>Plot:</p>
<p><a href="./summaries/arch.png"><img src="./summaries/arch.png"></a></p>
<h3 id="countries">Countries</h3>
<p>Contains a data column per country from the geolocation data, including <strong><em>unknown</em></strong> where a country could not be determined. The column names take the form of <a href="https://en.wikipedia.org/wiki/ISO_3166">ISO 3166</a> country codes. The columns are ordered by totals where the country with the highest total is listed first and so on, the column ordering may therefore change over time. The list is not fixed and may expand if additional countries not already listed are discovered via geolocation.</p>
<p>Source data: <a href="./summaries/country/">./summaries/country/</a></p>
<p>Aggregate data: <a href="./summaries/country.csv">./summaries/country.csv</a></p>
<p>Plot:</p>
<p><a href="./summaries/country.png"><img src="./summaries/country.png"></a></p>
<h3 id="operating-systems">Operating Systems</h3>
<p>Contains a data column per distributed operating system, including <strong><em>unknown</em></strong> where the operating system cannot be determined (due to <code>node-latest.tar.gz</code>), <strong><em>src</em></strong> for source tarballs and <strong><em>headers</em></strong> for header tarballs. The columns are ordered by totals where the operating system that has the highest total is listed first and so on, the column ordering may therefore change over time. The list is not fixed and may expand when additional operating systems are distributed from nodejs.org.</p>
<p>Source data: <a href="./summaries/os/">./summaries/os/</a></p>
<p>Aggregate data: <a href="./summaries/os.csv">./summaries/os.csv</a></p>
<p>Plot:</p>
<p><a href="./summaries/os.png"><img src="./summaries/os.png"></a></p>
<h3 id="versions">Versions</h3>
<p>Contains a data column per significant version number of Node.js. For &lt;= 0.12, the semver-minor version number is listed, for &gt;= 4.x the semver-major version number is listed. The <strong><em>unknown</em></strong> column contains counts of downloads where the version number could not be determined (see above note about <code>node-latest.tar.gz</code> and the <code>latest</code> directory symlinks coupled with <code>node.exe</code>). The columns are ordered by totals where the version that has the highest total is listed first and so on, the column ordering may therefore change over time. The list is not fixed and will expand when additional significant Node.js versions are made available for download.</p>
<p>Source data: <a href="./summaries/version/">./summaries/version/</a></p>
<p>Aggregate data: <a href="./summaries/version.csv">./summaries/version.csv</a></p>
<p>Plot:</p>
<p><a href="./summaries/version.png"><img src="./summaries/version.png"></a></p>
<h2 id="additional-stuff">Additional stuff</h2>
<p>The source of this file along with the various scripts used to generate the data files and graphs can be found in the <a href="https://github.com/nodejs/build">nodejs/build</a> GitHub repository in the <a href="https://github.com/nodejs/build/tree/master/ansible/www-standalone/tools/metrics">ansible/www-standalone/tools/metrics</a> directory. Questions, suggestions and pull requests are welcome in that repository.</p>
</div>
    </div>
  </body>
</html>
